﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Drawing.Printing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.IO;

namespace GIFT
{
    public class ControlJerarquia
    {
        //Constructor de la clase
        public ControlJerarquia()
        {
            consultaJerarquia = new ConsultaJerarquia();
        }

        //Retornar el atributo de la jerarquia con el nombre que recibe como parametro
        public String obtenerAtributoJerarquia(String nombre, String atributo)
        {
            //Manda a buscar en la base de datos el correlativo
            return consultaJerarquia.buscarAtributoJerarquia(nombre, atributo);
        }

        //Retorna una lista con todos los nombres de las jerarquias que existen
        public ArrayList obtenerJerarquias()
        {
            ArrayList nombres = consultaJerarquia.obtieneJerarquias(); //Obtiene las jerarquias y los retorna
            return nombres;
        }

        //Retorna true si el atributo que pide es verdadero
        public bool estaHabilitadoAtributoJerarquia(String nombre, String atributo)
        {
            return consultaJerarquia.estaHabilitadoCampoEnJerarquia(nombre, atributo);
        }

        //Recibe un nombre y retorna true si existe un jerarquia con este nombre
        public bool existeJerarquia(String nombre)
        {
            if (consultaJerarquia.existeJerarquia(nombre))//Si ya existe
            {
                return true;
            }
            return false;
        }

        //Recibe un nombre y retorna true si existe un termino con este nombre en la jerarquia 
        public bool existeTermino(String nombreTermino, String nombreJerarquia)
        {
            String correlativoJerarquia = consultaJerarquia.buscarAtributoJerarquia(nombreJerarquia, "correlativo");
            if (consultaJerarquia.existeTermino(nombreTermino,correlativoJerarquia))//Si ya existe
            {
                return true;
            }
            return false;
        }

        //Manda a borrar una jerarquia
        public void borrarJerarquia(String nombre)
        {
            consultaJerarquia.borrarJerarquia(nombre);
        }

        //Manda a borrar un termino de una jerarquia
        public void borrarTermino(String nombreTermino, String correlativoJerarquia)
        {
            consultaJerarquia.borrarTermino(nombreTermino, correlativoJerarquia);
        }

        //Retorna un arreglo con los nombres de las jerarquias que contengan la hilera que reciba como parametro en el nombre o la descripcion
        public ArrayList buscarContenidoEnJerarquia(String aBuscar)
        {
            ArrayList nombres = consultaJerarquia.buscarConcordanciasEnJerarquia(aBuscar);//Agrega al arreglo los nombres 
            return nombres;
        }

        //Retorna un arreglo con todos los nodos que pertenecen a una jerarquia
        public ArrayList obtieneTerminosJerarquia(String correlativoJerarquia)
        {
            return consultaJerarquia.obtieneTerminosJerarquia(correlativoJerarquia);
        }

        //Retornar el atributo del termino que pertenece a una jerarquia con el nombre que recibe como parametro 
        public String obtenerAtributoTermino(String nombre, String atributo, String correlativoJerarquia)
        {
            //Manda a buscar en la base de datos el correlativo
            return consultaJerarquia.buscarAtributoTerminoPorNombre(nombre, atributo, correlativoJerarquia);
        }

        //Retorna la lista con categorias de las jerarquias
        public ArrayList obtenerListaCategorias()
        {
            String id = consultaJerarquia.ObtenerIdlista(ListaCategorias);
            return consultaJerarquia.ObtenerTerminoslista(id);
        }

        //Retorna la lista con los niveles de las jerarquias
        public ArrayList obtenerListaNiveles()
        {
            String id = consultaJerarquia.ObtenerIdlista(ListaNiveles);
            return consultaJerarquia.ObtenerTerminoslista(id);
        }

        //Retorna la lista con las categorias para los terminos de las jerarquias
        public ArrayList obtenerListaCategoriasDeTerminos(String jerarquia)
        {
            String categorias = consultaJerarquia.buscarAtributoJerarquia(jerarquia, "[id categorias]"); //Obtiene la lista de categorias
            return consultaJerarquia.ObtenerTerminoslista(categorias);
        }

        //Retorna la lista con los niveles para los terminos de las jerarquias
        public ArrayList obtenerListaNivelesDeTerminos(String jerarquia)
        {
            String niveles = consultaJerarquia.buscarAtributoJerarquia(jerarquia, "[id niveles]"); //Obtiene la lista de niveles
            return consultaJerarquia.ObtenerTerminoslista(niveles);
        }

        //Retorna el numero de niveles
        public int obtenerNumeroNiveles(String nombreJerarquia)
        {
            return consultaJerarquia.numeroNivelesJerarquia(nombreJerarquia);
        }

        //Obtiene el nombre del tipo de categorias que utiliza la jerarquia que recibe como parametro
        public String obtenerCategoriaJerarquia(String jerarquia)
        {
            String categorias = consultaJerarquia.buscarAtributoJerarquia(jerarquia, "[id categorias]"); //Obtiene la lista de categorias
            return consultaJerarquia.ObtenerAtributoListaPorId(categorias, "nombre");
        }

        //Obtiene el nombre del tipo de niveles que utiliza la jerarquia que recibe como parametro
        public String obtenerNivelJerarquia(String jerarquia)
        {
            String niveles = consultaJerarquia.buscarAtributoJerarquia(jerarquia, "[id niveles]"); //Obtiene la lista de niveles
            return consultaJerarquia.ObtenerAtributoListaPorId(niveles, "nombre");
        }

        //Cambia el nivel de un termino de la jerarquia
        public void cambiarNivelDeTermino(String nombreJerarquia, String nombreTermino, String numeroNivel, String listaNiveles)
        {
            String correlativoJerarquia = consultaJerarquia.buscarAtributoJerarquia(nombreJerarquia, "correlativo");
            String idNivel = consultaJerarquia.obtenerIdNivelDeJerarquia(numeroNivel, correlativoJerarquia);
            if (idNivel == "")//Si existe se lo asigna 
            {
                crearNivelTermino(correlativoJerarquia, nombreTermino, numeroNivel, listaNiveles);
            }
            else //Si no existe se crea
            {
                consultaJerarquia.actualizarAtributoTermino(nombreTermino, "[id nivel]", idNivel, correlativoJerarquia);
            }
        }

        //Crea un nuevo nivel para el termino que recibe
        public void crearNivelTermino(String correlativoJerarquia, String nombreTermino,String numeroNivel, String listaNiveles)
        {
            String idLista = consultaJerarquia.ObtenerIdlista(listaNiveles);
            String idTerminoLista = "";
            ArrayList terminosLista = consultaJerarquia.ObtenerTerminoslista(idLista);
            for(int i =0; i < terminosLista.Count; ++i)
            {
                if((consultaJerarquia.obtenerNumeroOrdenTerminoLista(terminosLista[i].ToString(),idLista) + 1 ).ToString() == numeroNivel)
                {
                    idTerminoLista = consultaJerarquia.ObtenerAtributoTerminoListaPorNombre(terminosLista[i].ToString(), idLista, "[id]");
                }
            }
            if (idTerminoLista != "")
            {
                String idNivel = consultaJerarquia.creaNivel(numeroNivel,idTerminoLista);
                if (idNivel != "")
                {
                    consultaJerarquia.actualizarAtributoTermino(nombreTermino, "[id nivel]", idNivel, correlativoJerarquia);
                }
            }
        }

        //Manda a crear una nueva jerarquia
        public void crearNuevaJerarquia(String nombre, String descripcion)
        {
            consultaJerarquia.crearJerarquia(nombre, descripcion, "0", "0", "False", "False", "False", "False", "GetDate()", "False", "NULL", "NULL"); //Lo manda a agregar a la BD
        }

        //Manda a crear una nueva jerarquia
        public void crearNuevaJerarquia(String nombre, String descripcion, String numTerminos, String numNiveles, bool conCategorias, bool conNiveles, bool conVersion, bool conNombreUnico, bool conNombreNivel, String nombreCategorias, String nombreNiveles)
        {
            String cCategoria = "False", cNiveles = "False", cVersion = "False", cNombreUnico = "False", cNombreNivel = "False";
            if (conCategorias) { cCategoria = "True"; } //Si tiene categorias
            if (conNiveles) { cNiveles = "True"; }//Si tiene niveles
            if (conVersion) { cVersion = "True"; }//Si tiene version
            if (conNombreUnico) { cNombreUnico = "True"; }//Si tiene nombreUnico
            if (conNombreNivel) { cNombreNivel = "True"; }//Si tiene NombreNivel
            String idCategorias = consultaJerarquia.ObtenerIdlista(nombreCategorias);
            if (idCategorias == "")
            {
                idCategorias = "NULL";
            }
            String idNiveles = consultaJerarquia.ObtenerIdlista(nombreNiveles);
            if (idNiveles == "")
            {
                idNiveles = "NULL";
            }
            consultaJerarquia.crearJerarquia(nombre, descripcion, numTerminos, numNiveles, cCategoria, cNiveles, cVersion, cNombreUnico, "(GetDate())", cNombreNivel, idCategorias, idNiveles); //Lo manda a agregar a la BD
        }

        //Manda a crear un nuevo termino en la jerarquia
        public void crearNuevoTermino(String nombre, String descripcion, String idcategoria, String idnivel, String idPadre, String version, String correlativoJerarquia)
        {
            consultaJerarquia.crearTermino(nombre, descripcion, idcategoria, idnivel, idPadre, version, correlativoJerarquia);
        }

        //Copia todos los terminos de una jerarquia en otra que se creo
        public void copiarTerminosJerarquia(String nuevoNombre, String campoBase)
        {
            String correlativoActual = consultaJerarquia.buscarAtributoJerarquia(campoBase, "correlativo"); //Busca el correlativo actual
            String correlativoNuevo = consultaJerarquia.buscarAtributoJerarquia(nuevoNombre, "correlativo");//Busca el correlativo nuevo
            ArrayList terminosViejos = consultaJerarquia.obtieneTerminosJerarquia(correlativoActual); //Lista de terminos viejos
            String nombre = "", descripcion = "", idcategoria = "", idnivel = "", idPadre = "NULL", version = "", correlativoJerarquia = "";
            for (int i = 0; i < terminosViejos.Count; ++i)
            {
                //Saca los campos
                nombre = terminosViejos[i].ToString();
                descripcion = consultaJerarquia.buscarAtributoTerminoPorNombre(nombre, "descripcion", correlativoActual);
                idcategoria = consultaJerarquia.buscarAtributoTerminoPorNombre(nombre, "[id categoria]", correlativoActual);
                idnivel = consultaJerarquia.buscarAtributoTerminoPorNombre(nombre, "[id nivel]", correlativoActual);
                version = consultaJerarquia.buscarAtributoTerminoPorNombre(nombre, "[version]", correlativoActual);
                correlativoJerarquia = correlativoNuevo;
                if (idcategoria == "")
                {
                    idcategoria = "NULL";
                }
                if (idnivel == "")
                {
                    idnivel = "NULL";
                }
                else//Si tiene niveles copia los niveles
                {
                    String idTerminoLista = consultaJerarquia.ObtenerAtributoNivel(idnivel,"[id termino lista]");
                    String numeroNivel = consultaJerarquia.ObtenerAtributoNivel(idnivel, "[numero nivel]");
                    idnivel = consultaJerarquia.creaNivel(numeroNivel, idTerminoLista);
                }
                //Crea el nuevo termino
                consultaJerarquia.crearTermino(nombre, descripcion, idcategoria, idnivel, idPadre, version, correlativoJerarquia);
            }
            //Va a asignar los padres
            String idTerminoPadreViejo = "", idTerminoPadreNuevo = "";
            ArrayList terminosHijos = new ArrayList(); //Lista de terminos hijos
            for (int i = 0; i < terminosViejos.Count; ++i)
            {
                idTerminoPadreViejo = consultaJerarquia.buscarAtributoTerminoPorNombre(terminosViejos[i].ToString(), "id", correlativoActual);
                idTerminoPadreNuevo = consultaJerarquia.buscarAtributoTerminoPorNombre(terminosViejos[i].ToString(), "id", correlativoNuevo);
                terminosHijos = consultaJerarquia.ObtenerTerminosHijos(idTerminoPadreViejo, correlativoActual);
                for (int j = 0; j < terminosHijos.Count; ++j)
                {
                    consultaJerarquia.actualizarAtributoTermino(terminosHijos[j].ToString(), "[id padre]", idTerminoPadreNuevo, correlativoNuevo);
                }
            }
        }

        //Manda a modificar una jerarquia
        public void modificarJerarquia(String nombre, String descripcion, String numTerminos, String numNiveles, bool conCategorias, bool conNiveles, bool conVersion, bool conNombreUnico, bool conNombreNivel)
        {
            String cCategoria = "'False'", cNiveles = "'False'", cVersion = "'False'", cNombreUnico = "'False'", cNombreNivel = "'False'";
            if (conCategorias){ cCategoria = "'True'";} //Si tiene categorias
            if (conNiveles) { cNiveles = "'True'"; }//Si tiene niveles
            if (conVersion) { cVersion = "'True'"; }//Si tiene version
            if (conNombreUnico) { cNombreUnico = "'True'"; }//Si tiene nombreUnico
            if (conNombreNivel) { cNombreNivel = "'True'"; }//Si tiene NombreNivel
            consultaJerarquia.modificarJerarquia(nombre, descripcion, numTerminos, numNiveles, cCategoria, cNiveles, cVersion, cNombreUnico, cNombreNivel); //Lo manda a agregar a la BD
        }

        //Modifica el campo de un termino, recibe el nombre del termino, el atributo a modificar, el nuevo valor,y el correlativo de la jerarquia
        public void modificarAtributoTermino(String nombre, String atributo, String valor, String jerarquia)
        {
            consultaJerarquia.actualizarAtributoTermino(nombre, atributo, valor, jerarquia);
        }

        //Obtiene el nombre de categoria que utiliza un termino de la jerarquia 
        public String obtenerCategoriaTermino(String nombreTermino, String jerarquia)
        {
            String idCategorias = consultaJerarquia.buscarAtributoTerminoPorNombre(nombreTermino,"[id categoria]",jerarquia);
            if (idCategorias == "")
            {
                return idCategorias;
            }
            return consultaJerarquia.ObtenerAtributoTerminoListaPorId(idCategorias, "nombre");
        }

        //Obtiene el nombre de nivel que utiliza un termino de la jerarquia 
        public String obtenerNivelTermino(String nombreTermino, String jerarquia)
        {
            String idNivel = consultaJerarquia.buscarAtributoTerminoPorNombre(nombreTermino, "[id nivel]", jerarquia);
            String idTerminoLista = consultaJerarquia.ObtenerAtributoNivel(idNivel, "[id termino lista]");
            return consultaJerarquia.ObtenerAtributoTerminoListaPorId(idTerminoLista, "nombre");
        }

        //Retorna el nombre del termino de la jerarquia que contenga la hilera que reciba como parametro en el nombre o la descripcion
        public String buscarContenidoEnTermino(String aBuscar, String correlativoJerarquia)
        {
            return consultaJerarquia.buscarConcordanciasEnTermino(aBuscar, correlativoJerarquia);//Guarda el nombre de termino buscado 
        }

        //Modifica los datos de un termino, recibe los datos nuevos
        public void modificarTermino(String nombre, String descripcion, String idCategoria, String version, String correlativoJerarquia)
        {
            consultaJerarquia.modificarTermino(nombre,  descripcion,  idCategoria,  version,  correlativoJerarquia);
        }

        //Retorna el id de un termino de la lista por su nombre y el nombre de la lista a la que pertenece
        public String buscarIdTerminoListaPorNombre(String nombreTermino, String nombreListaPrincipal)
        {
            String idLista = consultaJerarquia.ObtenerIdlista(nombreListaPrincipal);
            return consultaJerarquia.ObtenerAtributoTerminoListaPorNombre(nombreTermino, idLista, "id");
        }

        //Cambia la lista de categorias de una jerarquia
        public void cambiarCategoriasJerarquia(String nombreJerarquia, String nombreCategoria)
        {
            String idCategoria = "NULL", conCategorias = "'False'";
            if (nombreCategoria != "NULL")//Si se desea poner por defecto
            {
                conCategorias = "'True'";
                idCategoria = consultaJerarquia.ObtenerIdlista(nombreCategoria);
            }
            else//Si se desean quitar las categorias
            {
                String correlativoJerarquia = consultaJerarquia.buscarAtributoJerarquia(nombreJerarquia, "correlativo");
                ArrayList terminoJerarquia = consultaJerarquia.obtieneTerminosJerarquia(correlativoJerarquia);
                for (int i = 0; i < terminoJerarquia.Count; ++i)
                {
                    consultaJerarquia.actualizarAtributoTermino(terminoJerarquia[i].ToString(), "[id categoria]", "NULL", correlativoJerarquia);
                }
            }
            consultaJerarquia.actualizarAtributoJerarquia(nombreJerarquia, "[id categorias]", idCategoria);
            consultaJerarquia.actualizarAtributoJerarquia(nombreJerarquia, "[con categorias]", conCategorias);
        }

        //Cambia la lista de niveles de una jerarquia
        public void cambiarNivelesJerarquia(String nombreJerarquia, String nombreNivel)
        {
            String idNivel = "NULL", conNivel = "'False'", conNombreNivel = "'False'";
            if (nombreNivel != "NULL")//Si se desea poner por defecto
            {
                conNombreNivel = conNivel = "'True'";
                idNivel = consultaJerarquia.ObtenerIdlista(nombreNivel);
            }
            else//Si se desean quitar los niveles
            {
                String correlativoJerarquia = consultaJerarquia.buscarAtributoJerarquia(nombreJerarquia, "correlativo");
                consultaJerarquia.eliminarNiveles(correlativoJerarquia); //Elimina los niveles que pertenecen a la jerarquia
                ArrayList terminoJerarquia = consultaJerarquia.obtieneTerminosJerarquia(correlativoJerarquia);
                for (int i = 0; i < terminoJerarquia.Count; ++i)
                {
                    consultaJerarquia.actualizarAtributoTermino(terminoJerarquia[i].ToString(), "[id nivel]", "NULL", correlativoJerarquia);
                }
            }
            consultaJerarquia.actualizarAtributoJerarquia(nombreJerarquia, "[id niveles]", idNivel);
            consultaJerarquia.actualizarAtributoJerarquia(nombreJerarquia, "[con niveles]", conNivel);
            consultaJerarquia.actualizarAtributoJerarquia(nombreJerarquia, "[con Nombre Nivel]", conNombreNivel);
        }

        //Elimina los niveles que pertenecen a la jerarquia
        public void eliminarNivelesCategorias(String correlativoJerarquia)
        {
            consultaJerarquia.eliminarNiveles(correlativoJerarquia); 
        }

        //Pone el valor (parametro 3) en el atributo(parametro 2) de todos terminos de una jerarquia(parametro 1)
        public void cambiarCampoAtributoDeTerminos(String nombreJerarquia, String atributo, String valor)
        {
            String correlativoJerarquia = consultaJerarquia.buscarAtributoJerarquia(nombreJerarquia, "correlativo");
            ArrayList terminos = consultaJerarquia.obtieneTerminosJerarquia(correlativoJerarquia);
            for (int i = 0; i < terminos.Count; ++i)
            {
                consultaJerarquia.actualizarAtributoTermino(terminos[i].ToString(), atributo, valor, correlativoJerarquia);
            }
        }

        //Modifica el numero de niveles de una jerarquia, recibe el incremento y retorna el valor nuevo
        public int modificarNumeroNiveles(String nombreJerarquia,int incremento)
        {
            int numNiveles = consultaJerarquia.buscarAtributoNumericoJerarquia(nombreJerarquia, "[numero niveles]");
            numNiveles += incremento;
            consultaJerarquia.actualizarAtributoJerarquia(nombreJerarquia,"[numero niveles]", numNiveles.ToString());
            return numNiveles;
        }

        //Modifica el numero de terminos de una jerarquia, recibe el incremento y retorna el valor nuevo
        public int modificarNumeroTerminos(String nombreJerarquia, int incremento)
        {
            int numTerminos = consultaJerarquia.buscarAtributoNumericoJerarquia(nombreJerarquia, "[numero terminos]");
            numTerminos += incremento;
            consultaJerarquia.actualizarAtributoJerarquia(nombreJerarquia, "[numero terminos]", numTerminos.ToString());
            return numTerminos;
        }

        //Cambia el id de padre de todos los hijos que tengan como id padre el que entra como parametro
        public void cambiarPadreDeHijos(String idPadre, String idNuevo, String correlativoJerarquia)
        {
            consultaJerarquia.cambiaPadreHijos(idPadre, idNuevo, correlativoJerarquia);
        }

        //Variables globales

        //Clase que realiza las consultas a la base de datos
        private ConsultaJerarquia consultaJerarquia;
        //Guarda el nombre de la lista que contiene el grupo de tipos de categorias para las jerarquias
        private String ListaCategorias = "nombres Categorias";
        //Guarda el nombre de la lista que contiene el grupo de tipos de niveles para las jerarquias
        private String ListaNiveles = "nombres Niveles";







        /*

        //Quita los nombres de niveles en todo lo relacionado con la jerarquia
        private void quitarNombresDeNivel(String correlativo)
        {
            String sentenciaSql;
            SqlDataReader datos;
            //Borra los niveles anteriores que eran parte de esta lista
            sentenciaSql = "DELETE FROM [GIFT].[dbo].[nivel] WHERE [id termino lista] in (SELECT T.[id] FROM [GIFT].[dbo].[termino_lista] T, [GIFT].[dbo].[lista] L, [GIFT].[dbo].[jerarquia] J WHERE T.[correlativo lista] = L.correlativo and L.correlativo = J.[id niveles] and J.[correlativo] = " + correlativo + ")";
            datos = Principal.HacerConsulta(sentenciaSql);
            Principal.GetConexion().Close();//Cierra la conexion
            sentenciaSql = "UPDATE [GIFT].[dbo].[jerarquia] SET [id niveles] = NULL WHERE correlativo = '" + correlativo + "'";
            datos = Principal.HacerConsulta(sentenciaSql);
            Principal.GetConexion().Close();//Cierra la conexion
            //Actualiza la jerarquia son nombre por nivel
            sentenciaSql = "UPDATE [GIFT].[dbo].[jerarquia] SET [con Nombre Nivel] = 'False' WHERE correlativo = '" + correlativo + "'";
            datos = Principal.HacerConsulta(sentenciaSql);
            Principal.GetConexion().Close();//Cierra la conexion
        }

        //captura el evento cuando se cambia el nivel
        private void cambioNivel(object sender, EventArgs e)
        {
            if (Principal.estaAbierta(Principal.NombreCampo))
            {
                ArrayList resultados = new ArrayList();
                TabPage pestana = Principal.GetTabControl().SelectedTab;
                Control.ControlCollection coll = pestana.Controls;
                foreach (Control c in coll)
                {
                    if (c != null)
                    {
                        if (c is TextBox || c is ComboBox)
                        {
                            resultados.Add(c);
                        }
                    }
                }
                ComboBox nombreNiveles = (ComboBox)resultados[0];
                ComboBox ListaNombresNiveles = (ComboBox)resultados[8];
                ComboBox campoNumeroNiveles = (ComboBox)resultados[16];
                TextBox correlativo = (TextBox)resultados[12];
                nombreNiveles.Enabled = true;
                nombreNiveles.Items.Clear();//Limpia la lista
                campoNumeroNiveles.Items.Clear();
                llenarListaNiveles(ListaNombresNiveles.Text, nombreNiveles, campoNumeroNiveles, correlativo.Text);
            }
        }

        //Llena la lista desplegable con los niveles que pertenecen a esta
        private void llenarListaNiveles(String NombresNiveles, ComboBox campoListaNiveles, ComboBox campoNumeroNiveles, String correlativo)
        {
            SqlDataReader datos;
            String sentenciaSql;

            if (!Principal.estaAbierta(Principal.NombreCampo))//Pregunta si la pestana no esta abierta y por lo tanto debe de cargar los niveles
            {
                //Busca los terminos que forman parte de la nueva lista de niveles
                sentenciaSql = "SELECT T.[nombre],T.[id] FROM [GIFT].[dbo].[termino_lista] T WHERE T.[correlativo lista] in ( SELECT L.[correlativo] FROM [GIFT].[dbo].[lista] L WHERE L.[nombre]= '" + NombresNiveles + "')";
                datos = Principal.HacerConsulta(sentenciaSql);
                ArrayList nombre = new ArrayList();
                ArrayList id = new ArrayList();
                while (datos.Read())
                {
                    nombre.Add(datos.GetValue(0).ToString());
                    id.Add(datos.GetValue(1).ToString());
                }
                Principal.GetConexion().Close();//Cierra la conexion
                for (int i = 1; i <= nombre.Count; ++i)
                {
                    campoListaNiveles.Items.Add(nombre[i - 1]);//Agrega a la lista desplegable de nombres de niveles
                    campoNumeroNiveles.Items.Add(i);//Agrega a la lista desplegable de numero de niveles
                }
                sentenciaSql = "SELECT [correlativo] FROM [GIFT].[dbo].[lista] WHERE  [nombre] =  '" + NombresNiveles + "'";
                datos = Principal.HacerConsulta(sentenciaSql);
                datos.Read();
                String idNiv = datos.GetValue(0).ToString();
                Principal.GetConexion().Close();//Cierra la conexion
                sentenciaSql = "UPDATE [GIFT].[dbo].[jerarquia] SET [id niveles] = " + idNiv + " WHERE correlativo = '" + correlativo + "'";
                datos = Principal.HacerConsulta(sentenciaSql);
                Principal.GetConexion().Close();//Cierra la conexion
                return;
            }

            //Saca el nombre actual de la lista de niveles de la jerarquia
            sentenciaSql = "SELECT L.nombre FROM  [GIFT].[dbo].[jerarquia] J,[GIFT].[dbo].[lista] L WHERE J.[id niveles] = L.[correlativo] and J.correlativo = " + correlativo;
            datos = Principal.HacerConsulta(sentenciaSql);
            datos.Read();

            if (!datos.HasRows)//Pregunta si no tiene datos lo que significa que la jerarquia no tenia niveles
            {
                Principal.GetConexion().Close();//Cierra la conexion
                sentenciaSql = "DELETE FROM [GIFT].[dbo].[nivel] WHERE [id termino lista] in (SELECT T.[id] FROM [GIFT].[dbo].[termino_lista] T, [GIFT].[dbo].[lista] L, [GIFT].[dbo].[jerarquia] J WHERE T.[correlativo lista] = L.correlativo and L.correlativo = J.[id niveles] and J.[correlativo] = " + correlativo + ")";
                datos = Principal.HacerConsulta(sentenciaSql);
                Principal.GetConexion().Close();//Cierra la conexion
                sentenciaSql = "SELECT T.[nombre],T.[id] FROM [GIFT].[dbo].[termino_lista] T WHERE T.[correlativo lista] in ( SELECT L.[correlativo] FROM [GIFT].[dbo].[lista] L WHERE L.[nombre]= '" + NombresNiveles + "')";
                datos = Principal.HacerConsulta(sentenciaSql);
                ArrayList nombre = new ArrayList();
                ArrayList id = new ArrayList();
                while (datos.Read())
                {
                    nombre.Add(datos.GetValue(0).ToString());
                    id.Add(datos.GetValue(1).ToString());
                }
                Principal.GetConexion().Close();//Cierra la conexion
                for (int i = 1; i <= nombre.Count; ++i)
                {
                    campoListaNiveles.Items.Add(nombre[i - 1]);//Agrega a la lista desplegable de nombres de niveles
                    campoNumeroNiveles.Items.Add(i);//Agrega a la lista desplegable de numero de niveles
                    crearNiveles(i, (id[i - 1]).ToString());//Manda a crear los niveles
                }
                sentenciaSql = "SELECT [correlativo] FROM [GIFT].[dbo].[lista] WHERE  [nombre] =  '" + NombresNiveles + "'";
                datos = Principal.HacerConsulta(sentenciaSql);
                datos.Read();
                String idNiv = datos.GetValue(0).ToString();
                Principal.GetConexion().Close();//Cierra la conexion
                sentenciaSql = "UPDATE [GIFT].[dbo].[jerarquia] SET [id niveles] = " + idNiv + " WHERE correlativo = '" + correlativo + "'";
                datos = Principal.HacerConsulta(sentenciaSql);
                Principal.GetConexion().Close();//Cierra la conexion
                return;
            }

            if (datos.GetValue(0).ToString() != NombresNiveles)//Pregunta si es la misma que la que entra por parametro
            {
                Principal.GetConexion().Close();//Cierra la conexion
                //Borra los niveles anteriores que eran parte de esta lista
                sentenciaSql = "DELETE FROM [GIFT].[dbo].[nivel] WHERE [id termino lista] in (SELECT T.[id] FROM [GIFT].[dbo].[termino_lista] T, [GIFT].[dbo].[lista] L, [GIFT].[dbo].[jerarquia] J WHERE T.[correlativo lista] = L.correlativo and L.correlativo = J.[id niveles] and J.[correlativo] = " + correlativo + ")";
                datos = Principal.HacerConsulta(sentenciaSql);
                Principal.GetConexion().Close();//Cierra la conexion
                //Busca los terminos que forman parte de la nueva lista de niveles
                sentenciaSql = "SELECT T.[nombre],T.[id] FROM [GIFT].[dbo].[termino_lista] T WHERE T.[correlativo lista] in ( SELECT L.[correlativo] FROM [GIFT].[dbo].[lista] L WHERE L.[nombre]= '" + NombresNiveles + "')";
                datos = Principal.HacerConsulta(sentenciaSql);
                ArrayList nombre = new ArrayList();
                ArrayList id = new ArrayList();
                while (datos.Read())
                {
                    nombre.Add(datos.GetValue(0).ToString());
                    id.Add(datos.GetValue(1).ToString());
                }
                Principal.GetConexion().Close();//Cierra la conexion
                for (int i = 1; i <= nombre.Count; ++i)
                {
                    campoListaNiveles.Items.Add(nombre[i - 1]);//Agrega a la lista desplegable de nombres de niveles
                    campoNumeroNiveles.Items.Add(i);//Agrega a la lista desplegable de numero de niveles
                    modificarNiveles(i, (id[i - 1]).ToString(), correlativo);//Manda a crear los niveles
                }

                sentenciaSql = "SELECT [correlativo] FROM [GIFT].[dbo].[lista] WHERE  [nombre] =  '" + NombresNiveles + "'";
                datos = Principal.HacerConsulta(sentenciaSql);
                datos.Read();
                String idNiv = datos.GetValue(0).ToString();
                Principal.GetConexion().Close();//Cierra la conexion
                sentenciaSql = "UPDATE [GIFT].[dbo].[jerarquia] SET [id niveles] = " + idNiv + " WHERE correlativo = '" + correlativo + "'";
                datos = Principal.HacerConsulta(sentenciaSql);
                Principal.GetConexion().Close();//Cierra la conexion
                return;
            }
            Principal.GetConexion().Close();//Cierra la conexion
        }

        //Crea los niveles con la lista de niveles 
        private void modificarNiveles(int numNiv, String idTerminoLista, String correlativo)
        {
            SqlDataReader datos;
            String sentenciaSql = "INSERT INTO [GIFT].[dbo].[nivel] ([numero nivel] ,[id termino lista]) VALUES (" + numNiv + "," + idTerminoLista + ")";
            datos = Principal.HacerConsulta(sentenciaSql);
            Principal.GetConexion().Close();//Cierra la conexion
            //Obtiene el id del nivel recien creado
            sentenciaSql = "SELECT [id] FROM [GIFT].[dbo].[nivel] WHERE [numero nivel] = " + numNiv + " AND [id termino lista]= " + idTerminoLista;
            datos = Principal.HacerConsulta(sentenciaSql);
            datos.Read();
            String idNivelNuevo = datos.GetValue(0).ToString();
            Principal.GetConexion().Close();//Cierra la conexion
            //Obtiene los id's de los niveles que participan en la jerarquia y tienen el numero de nivel que se esta trabajando
            sentenciaSql = "SELECT N.[id] FROM [GIFT].[dbo].[nivel] N, [GIFT].[dbo].[termino_lista] T ,[GIFT].[dbo].[jerarquia] J  WHERE N.[numero nivel]= " + numNiv + " and N.[id termino lista] = T.id and T.[correlativo lista] = J.[id niveles] and J.correlativo = " + correlativo;
            datos = Principal.HacerConsulta(sentenciaSql);
            datos.Read();
            String idNivelViejo = datos.GetValue(0).ToString();
            Principal.GetConexion().Close();//Cierra la conexion
            //Actualiza los id's de los niveles de los terminos de la jerarquia
            sentenciaSql = "UPDATE [GIFT].[dbo].[termino] SET [id nivel] = " + idNivelNuevo + " WHERE [correlativo jerarquia] = " + correlativo + " and [id nivel] = " + idNivelViejo;
            datos = Principal.HacerConsulta(sentenciaSql);
            Principal.GetConexion().Close();//Cierra la conexion
        }

        //Crea los niveles con la lista de niveles 
        private void crearNiveles(int numNiv, String idTerminoLista)
        {
            SqlDataReader datos;
            String sentenciaSql = "INSERT INTO [GIFT].[dbo].[nivel] ([numero nivel] ,[id termino lista]) VALUES (" + numNiv + "," + idTerminoLista + ")";
            datos = Principal.HacerConsulta(sentenciaSql);
            Principal.GetConexion().Close();//Cierra la conexion

            //DEBE DE MODIFICAR LOS ID DE NIVEL DE LOS TERMINOS DE LA JERARQUIA POR EL NUEVO
        }


        

        //Asigna el nivel del termino creado
        private String asignarNivel(String correlativo, TreeNode padre, TreeView arbol, ComboBox nombreNivel, ComboBox numeroNivel)
        {
            String numNivel; //Guarda el nivel
            if (padre == null)//Si va a ser raiz
            {
                numNivel = "1"; //Va a ser del primer nivel
            }
            else//Si no va a ser raiz
            {
                numNivel = (padre.Level + 2).ToString(); //Busca el nivel al que pertenece en el arbol
            }
            SqlDataReader datos;
            String sentenciaSql = "SELECT [id] FROM [GIFT].[dbo].[nivel] WHERE [numero nivel] = " + numNivel + " and [id termino lista] in ( SELECT T.[id] FROM [GIFT].[dbo].[termino_lista] T ,[GIFT].[dbo].[jerarquia] J, [GIFT].[dbo].[lista] L WHERE T.[correlativo lista] = J.[id niveles] and J.correlativo = " + correlativo + ")";
            datos = Principal.HacerConsulta(sentenciaSql);
            datos.Read();
            String nivel = "0";
            if (datos.HasRows)//Si el nivel existe guarda su id
            {
                nivel = datos.GetValue(0).ToString();
                Principal.GetConexion().Close();//Cierra la conexion
            }
            else
            {//Si no existe lo crea
                Principal.GetConexion().Close();//Cierra la conexion
                sentenciaSql = "SELECT id FROM [GIFT].[dbo].[nivel]  Where [numero nivel]=" + numNivel + " and [id termino lista] = NULL";
                datos = Principal.HacerConsulta(sentenciaSql);
                if (datos.HasRows)
                {
                    datos.Read();
                    nivel = datos.GetValue(0).ToString();
                    Principal.GetConexion().Close();//Cierra la conexion
                }
                else
                {
                    Principal.GetConexion().Close();//Cierra la conexion
                    sentenciaSql = "INSERT INTO [GIFT].[dbo].[nivel]([numero nivel])VALUES(" + numNivel + ")";
                    datos = Principal.HacerConsulta(sentenciaSql);
                    Principal.GetConexion().Close();//Cierra la conexion
                    //Obtiene el id del nivel que acaba de agregar
                    sentenciaSql = "SELECT id FROM [GIFT].[dbo].[nivel]  Where [numero nivel]=" + numNivel; // +" and [id termino lista] = NULL";
                    datos = Principal.HacerConsulta(sentenciaSql);
                    datos.Read();
                    nivel = datos.GetValue(0).ToString();
                    Principal.GetConexion().Close();//Cierra la conexion
                }
                //nombreNivel.Items.Add(numNivel);
                //numeroNivel.Items.Add(numNivel);
            }
            return nivel;
        }

        //Captura el evento del click en agregar hijo en click derecho del arbol
        public void agregarHijo_arbol_jerarquia_Click()
        {
            ArrayList resultados = new ArrayList();
            TabPage pestana = Principal.GetTabControl().SelectedTab;
            Control.ControlCollection coll = pestana.Controls;
            foreach (Control c in coll)
            {
                if (c != null)
                {
                    if (c is TreeView || c is TextBox)
                    {
                        resultados.Add(c);
                    }
                }
            }
            TreeView arbolJerarquia = (TreeView)resultados[10];
            TextBox nombreTermino = (TextBox)resultados[2];
            TreeNode padre = arbolJerarquia.SelectedNode; //Busca al padre 
            //Va a agregar al treeView
            TreeNode tnode = new TreeNode("nuevo");
            tnode.ContextMenuStrip = Principal.contextMenuStrip_clickDerecho_arbol_jerarquia; //Agrega el menuStrip para el click derecho
            if (padre == null)//si es nodo raiz
            {
                arbolJerarquia.Nodes.Add(tnode);
            }
            else //Si no es raiz
            {
                padre.Nodes.Add(tnode);
            }
            arbolJerarquia.ExpandAll();
            tnode.BeginEdit(); //Empieza la edicion de la etiqueta
            nombreTermino.Text = "";
        }

        //Captura el evento de editar la etiqueta del nodo
        private void etiqueta_editada(object sender, NodeLabelEditEventArgs e)
        {
            ArrayList resultados = new ArrayList();
            TabPage pestana = Principal.GetTabControl().SelectedTab;
            Control.ControlCollection coll = pestana.Controls;
            foreach (Control c in coll)
            {
                if (c != null)
                {
                    if (c is TreeView || c is ComboBox || c is TextBox)
                    {
                        resultados.Add(c);
                    }
                }
            }
            TreeView arbolJerarquia = (TreeView)resultados[13];
            ComboBox nombreCategoria = (ComboBox)resultados[1];
            ComboBox nombreNivel = (ComboBox)resultados[0];
            ComboBox campoNumeroNivel = (ComboBox)resultados[17];
            TextBox correlativo = (TextBox)resultados[12];
            TextBox descripcion = (TextBox)resultados[3];
            TextBox cantidadTerminos = (TextBox)resultados[7];
            TextBox nombreTermino = (TextBox)resultados[4];
            String sentenciaSql;
            SqlDataReader datos;
            if (nombreTermino.Text != "")//Si no es uno nuevo
            {
                //Averigua si el nombre que esta en el text box ya existe, (si es un cambio de nombre)
                sentenciaSql = "select id from termino where nombre = '" + e.Label + "' and [correlativo jerarquia] = " + correlativo.Text;
                datos = Principal.HacerConsulta(sentenciaSql);
                if (datos.HasRows)//Si el nombre ya existe
                {
                    e.CancelEdit = true; //Cancela la edicion
                    Principal.GetConexion().Close();//Cierra la conexion
                }
                else
                {
                    Principal.GetConexion().Close();//Cierra la conexion
                    sentenciaSql = "select id from [GIFT].[dbo].[termino] where nombre = '" + nombreTermino.Text + "' and [correlativo jerarquia] = " + correlativo.Text;
                    datos = Principal.HacerConsulta(sentenciaSql);
                    datos.Read();
                    String id = datos.GetValue(0).ToString();
                    Principal.GetConexion().Close();//Cierra la conexion
                    sentenciaSql = "UPDATE [GIFT].[dbo].[termino] SET nombre ='" + e.Label + "' Where id =" + id;//actualiza el nombre
                    datos = Principal.HacerConsulta(sentenciaSql);
                    nombreTermino.Text = e.Label;
                    Principal.GetConexion().Close();//Cierra la conexion
                }
            }
            else //Si es nuevo
            {
                //Revisa que el nombre no exista
                sentenciaSql = "select t.id from termino t, jerarquia j where t.nombre = '" + e.Label + "' and j.correlativo =" + correlativo.Text + " and T.[correlativo jerarquia] = " + correlativo.Text;
                datos = Principal.HacerConsulta(sentenciaSql);
                if (datos.HasRows)//Si existe algun nombre igual
                {
                    Principal.GetConexion().Close();//Cierra la conexion
                    e.Node.Remove();
                    return;//se sale
                }
                Principal.GetConexion().Close();//Cierra la conexion
                //Manda a agregar el termino 
                agregarTermino(e.Label, "", "", "", correlativo.Text, false, false, false, true, false,
                  nombreCategoria, nombreNivel, campoNumeroNivel, cantidadTerminos, arbolJerarquia);
            }
            //Limpia los campos
            nombreTermino.Text = descripcion.Text = nombreCategoria.Text = nombreNivel.Text = nombreCategoria.Text = nombreNivel.Text = "";
        }

        

        private void cambioNivelDragDrop(String correlativo, TreeNode nodo, TreeNode padre, TreeView arbol, ComboBox numeroNivel, ComboBox nombreNivel)
        {
            SqlDataReader datos;
            String sentenciaSql;
            if (padre == null)
            {
                String nivelTermino = asignarNivel(correlativo, padre, arbol, nombreNivel, numeroNivel);
                sentenciaSql = "UPDATE [GIFT].[dbo].[termino] SET [id nivel] = " + nivelTermino + " WHERE nombre = '" + nodo.Text + "' and [correlativo jerarquia] = " + correlativo;
                datos = Principal.HacerConsulta(sentenciaSql);
                Principal.GetConexion().Close();//Cierra la conexion
                padre = nodo;
            }
            foreach (TreeNode tn in padre.Nodes)
            {
                String nivelTermino = asignarNivel(correlativo, padre, arbol, nombreNivel, numeroNivel);
                sentenciaSql = "UPDATE [GIFT].[dbo].[termino] SET [id nivel] = " + nivelTermino + " WHERE nombre = '" + tn.Text + "' and [correlativo jerarquia] = " + correlativo;
                datos = Principal.HacerConsulta(sentenciaSql);
                Principal.GetConexion().Close();//Cierra la conexion
                cambioNivelDragDrop(correlativo, tn, tn.Parent, arbol, numeroNivel, nombreNivel);
            }
        }

        */

    }
}//FIN DE CLASE JERARQUIA




